이 구분선 아래는 v1.0 기준 문서다. 위 v2.0 작업 지시와 충돌 시 v2.0을 우선 적용한다.
RVC SW Controller 프로젝트
프로젝트 개요
로봇 청소기(RVC) SW Controller를 OOAD 프로세스로 개발한다.
요구사항
RVC는 가정의 표면을 자동으로 청소하고 닦는다
청소하면서 직진한다
전방 센서가 장애물을 감지하면 청소를 멈추고, 좌/우로 방향을 틀어 청소하며 전진한다
앞/좌/우 모두 장애물이 있으면 후진 후 좌/우로 방향을 틀어 전진한다
먼지를 감지하면 잠시 청소 출력을 높인다
HW 제어의 상세 설계 및 구현은 고려하지 않는다
자동 청소 기능에만 집중한다
폴더 구조
arch/requirements/ - 요구사항 문서
arch/usecases/ - Use Case 문서
arch/analysis/ssd/ - SSD 다이어그램
arch/analysis/domain/ - 도메인 모델
arch/design/SD/ - 시퀀스 다이어그램
arch/design/class/ - 클래스 다이어그램
arch/system-tests/ - 시스템 테스트
src/ - 소스 코드
tests/ - 테스트 코드
simulator/ - RVC 동작 시뮬레이터 (유일하게 객체지향으로 개발하지 않아도 됨)
User가 시스템을 시작하면 CleaningMotor를 Normal 출력으로 가동하고 DriveMotor로 직진하며 바닥을 청소하고 닦는다. 이 동작은 시스템의 기본(Base) 흐름이며, 나머지 UC는 이를 확장(extend)한다.
UC-002: 측면 장애물 회피
전방에 장애물이 감지되면 청소를 일시 정지하고, 변경좌 또는 우 중 여유 공간이 있을 때 sideStatus(LEFT) 및 rotateRight() + sideStatus(RIGHT) 로 양측을 순차 확인한다. 변경좌·우 모두 여유 있으면 랜덤으로 방향을 선택한다. 좌측을 우선으로 선택한다. 좌측이 막힌 경우에만 우측으로 선택한다. 좌·우 모두 막힌 경우 E1으로 UC-003에 진입한다.
UC-003: 삼면 장애물 후진 회피
변경전방·좌·우 모두 장애물이 감지될 때 ObstacleSensor가 직접 트리거한다. UC-002 E1에서 진입한다 (sideStatus(LEFT, blocked) + sideStatus(RIGHT, blocked) 내부 판정). 후진하며 sideStatus(LEFT) 또는 rotateRight() + sideStatus(RIGHT)로 여유 공간을 확인하고, 확보되면 변경랜덤으로 좌측을 우선으로 선택하여 회전하고 전진한다.
UC-004: 고출력 청소
먼지가 감지되면 CleaningMotor 출력을 High로 높이고, 일정 시간이 경과하면 자동으로 Normal 출력으로 복귀한다. 주행은 중단 없이 계속한다.
5. Use Case 간 관계
arch/usecases/UC-001.md
UC-001v2.0 수정
UC-001: 자동 청소 수행
기본 정보
항목
내용
Use Case ID
UC-001
이름
자동 청소 수행
액터
User (Primary), DriveMotor (Secondary), CleaningMotor (Secondary)
관련 요구사항
FR-01, SR-01, SR-02
종류
Base Use Case
사전 조건 (Preconditions)
User가 RVC를 시작시킨다.
사후 조건 (Postconditions)
RVC가 CleaningMotor Normal 출력으로 직진하며 청소 및 닦기를 수행하고 있다.
기본 흐름 (Main Flow)
단계
액터/시스템
행위
1
User
RVC를 시작시킨다.
2
System
CleaningMotor를 Normal 출력으로 가동한다.
3
System
DriveMotor를 전진 방향으로 구동한다.
4
System
직진하며 바닥을 청소하고 닦는다.
5
System
단계 4를 계속 반복한다.
확장 포인트 (Extension Points)
확장 포인트
조건
확장 UC
EP-1
변경frontObstacleDetected AND (좌 OR 우 여유 있음) frontObstacleDetected (좌·우 여유 공간 확인은 UC-002 내에서 sideStatus(LEFT) → rotateRight() + sideStatus(RIGHT) 순으로 수행)
변경좌 또는 우 중 하나 이상의 방향에 여유 공간이 있다. 좌·우 여유 공간 여부는 이 UC 내부에서 순차 확인한다 (진입 시점에 미결정).
사후 조건 (Postconditions)
변경RVC가 장애물이 없는 방향(좌 또는 우)으로 회전한 뒤, 청소를 재개하며 전진하고 있다. (정상) 좌 또는 우로 회전 후 청소를 재개하며 전진한다. / (예외 E1) 좌·우 모두 막힌 경우 UC-003으로 전환한다.
기본 흐름 (Main Flow)
단계
액터/시스템
행위
1
ObstacleSensor
전방 장애물 감지 신호를 시스템에 전달한다.
2
System
CleaningMotor를 정지한다.
3
System
DriveMotor를 정지한다.
4
ObstacleSensor
변경좌측 장애물 유무 신호를 시스템에 전달한다. sideStatus(LEFT, status) — 좌측 센서가 좌측 장애물 유무 신호를 시스템에 전달한다.
5
System
추가 DriveMotor에 rotateRight()를 명령한다 (전방 센서를 우측으로 회전).
6
ObstacleSensor
추가 sideStatus(RIGHT, status) — 전방 센서(우측 향함)가 우측 장애물 유무 신호를 시스템에 전달한다.
7
System
추가 DriveMotor에 rotateLeft()를 명령한다 (정면 복귀). 이후 turn()이 원래 전방 기준으로 동작하도록 보장한다.
8
System
변경여유 있는 방향(좌 또는 우)으로 DriveMotor를 회전시킨다. 좌측이 여유 있으면 좌회전한다. 좌측이 막히고 우측이 여유 있으면 우회전한다.
9
System
CleaningMotor를 Normal 출력으로 재가동한다.
10
System
DriveMotor를 전진 방향으로 구동한다.
11
UC-001 기본 흐름 단계 4로 복귀한다.
대안 흐름 (Alternative Flow)
변경A1: 좌·우 모두 여유 있을 때 A1: 좌측 여유 우선 선택
변경단계 5에서 좌·우 모두 여유 있으면 랜덤으로 방향을 선택하여 회전한다. 단계 7에서 좌측이 여유 있으면 좌측을 우선으로 선택한다. 좌·우 모두 여유 있더라도 항상 좌측을 선택한다.
예외 흐름 (Exception Flow)
E1: 변경회피 도중 전/좌/우 모두 막힘 좌·우 모두 막힘 확인 후 UC-003 전환
변경단계 5 이전에 삼면이 모두 막힌 것이 감지되면 UC-003으로 전환한다. 단계 7(rotateLeft 정면 복귀) 완료 후 sideStatus(LEFT)와 sideStatus(RIGHT) 모두 막힘이면 UC-003으로 전환한다.
활동 다이어그램
arch/usecases/UC-003.md
UC-003v2.0 수정
UC-003: 삼면 장애물 후진 회피
기본 정보
항목
내용
Use Case ID
UC-003
이름
삼면 장애물 후진 회피
액터
ObstacleSensor (Primary), DriveMotor (Secondary), 추가 CleaningMotor (Secondary)
관련 요구사항
FR-03, SR-04
종류
변경Extension of UC-001 (EP-2) Extension of UC-002 (E1)
사전 조건 (Preconditions)
UC-001 및 UC-002가 실행 중이다.
변경전방·좌·우 방향 모두에 장애물이 감지되었다. UC-002 내에서 sideStatus(LEFT, blocked) 및 sideStatus(RIGHT, blocked) 가 모두 수신되어 좌·우 모두 막힘이 확인되었다 (UC-002 E1). 우측 전용 센서 없음.
사후 조건 (Postconditions)
RVC가 후진 중 확보된 여유 방향(좌 또는 우)으로 회전한 뒤 전진하고 있다.
기본 흐름 (Main Flow)
단계
액터/시스템
행위
1
(UC-002 E1)
변경ObstacleSensor: 전방·좌측 장애물 감지 신호를 전달한다. 좌·우 모두 막힘이 확인된 상태로 UC-002 E1에서 진입한다. (CleaningMotor는 UC-002 단계 2에서 이미 정지됨.)
2
System
DriveMotor를 후진 방향으로 구동한다.
3
ObstacleSensor
변경좌측 장애물 유무 신호를 계속 전달한다. sideStatus(LEFT, status) — 좌측 센서가 좌측 장애물 유무 신호를 전달한다.
4
System
추가 좌측이 여전히 막힌 경우 DriveMotor에 rotateRight()를 명령한다 (전방 센서를 우측으로 회전).
5
ObstacleSensor
추가 sideStatus(RIGHT, status) — 전방 센서(우측 향함)가 우측 장애물 유무 신호를 전달한다.
6
System
추가 rotateRight()를 호출한 경우 DriveMotor에 rotateLeft()를 명령한다 (정면 복귀).
7
System
좌 또는 우에 여유 공간이 확보될 때까지 단계 2~6을 반복한다.
8
System
DriveMotor를 정지한다.
9
System
변경여유 공간이 확보된 방향(좌 또는 우)으로 DriveMotor를 회전시킨다. 좌측에 여유 공간이 확보된 경우 좌회전한다. 좌측이 막힌 경우에만 우측으로 DriveMotor를 회전시킨다.
10
System
DriveMotor를 전진 방향으로 구동한다.
11
System
CleaningMotor를 Normal 출력으로 재가동한다.
12
UC-001 기본 흐름 단계 4로 복귀한다.
대안 흐름 (Alternative Flow)
변경A1: 후진 중 좌·우 동시에 여유 공간 확보 A1: 후진 중 좌측 여유 공간 우선 선택
변경단계 5에서 좌·우 모두 동시에 해소되면 랜덤으로 방향을 선택하여 회전한다. 단계 3에서 sideStatus(LEFT, clear)가 수신되면 단계 4~6을 건너뛰고 즉시 좌회전한다. 좌·우 모두 동시에 확보되더라도 항상 좌측을 우선으로 선택한다.
활동 다이어그램
arch/usecases/UC-004.md
UC-004
UC-004: 고출력 청소
기본 정보
항목
내용
Use Case ID
UC-004
이름
고출력 청소
액터
DustSensor (Primary), CleaningMotor (Secondary)
관련 요구사항
FR-04, SR-05
종류
Extension of UC-001 (EP-3)
사전 조건 (Preconditions)
UC-001이 실행 중이다 (CleaningMotor Normal 출력, DriveMotor 전진 중).
DustSensor가 먼지를 감지하였다.
사후 조건 (Postconditions)
CleaningMotor가 Normal 출력으로 복귀하였다.
DriveMotor 전진은 UC-004 실행 중에도 중단 없이 유지되었다.
기본 흐름 (Main Flow)
단계
액터/시스템
행위
1
DustSensor
먼지 감지 신호를 시스템에 전달한다.
2
System
CleaningMotor 출력을 High로 전환한다.
3
System
고출력 지속 타이머를 시작한다.
4
System
DriveMotor 전진을 유지한다 (주행 중단 없음).
5
System
타이머가 만료될 때까지 단계 4를 반복한다.
6
System
CleaningMotor 출력을 Normal로 복귀시킨다.
7
UC-001 기본 흐름 단계 4로 복귀한다.
대안 흐름 (Alternative Flow)
A1: 고출력 청소 중 장애물 감지
단계 4 중 장애물이 감지되면 UC-002 또는 UC-003을 수행한다.
장애물 회피 완료 후 남은 타이머 시간만큼 고출력 청소를 계속하고 단계 6으로 진행한다.
A2: 고출력 청소 중 추가 먼지 감지
단계 5 중 먼지가 재감지되면 타이머를 초기화하여 단계 3부터 재시작한다.
활동 다이어그램
분석 — SSD
arch/analysis/ssd/SSD-001.md
SSD-001
SSD-001: 자동 청소 수행
연관 UC: UC-001
관련 요구사항: FR-01, SR-01, SR-02
시스템 시퀀스 다이어그램
시스템 오퍼레이션 목록
오퍼레이션
설명
start()
User가 시스템을 시작시킨다
arch/analysis/ssd/SSD-002.md
SSD-002v2.0 수정
SSD-002: 측면 장애물 회피
연관 UC: UC-002
관련 요구사항: FR-02, SR-03
시스템 시퀀스 다이어그램
시스템 오퍼레이션 목록
오퍼레이션
설명
frontObstacleDetected()
전방 장애물 감지 신호를 수신한다
변경sideStatus(available)sideStatus(LEFT, status)
변경여유 공간이 있는 방향(Direction)의 목록을 수신한다 좌측 센서가 좌측 장애물 유무 신호를 전달한다. 회전 없이 직접 수신.
추가sideStatus(RIGHT, status)
DriveMotor.rotateRight() 이후 전방 센서(우측 향함)가 우측 장애물 유무 신호를 전달한다 (우측 전용 센서 없음).
추가rotateLeft()
sideStatus(RIGHT) 수신 후 DriveMotor를 정면으로 복귀시킨다. 이후 turn()이 항상 원래 전방 기준으로 동작하도록 보장한다.
arch/analysis/ssd/SSD-003.md
SSD-003v2.0 수정
SSD-003: 삼면 장애물 후진 회피
연관 UC: UC-003
관련 요구사항: FR-03, SR-04
시스템 시퀀스 다이어그램
시스템 오퍼레이션 목록
오퍼레이션
설명
삭제
UC-002 내에서 sideStatus(LEFT) + sideStatus(RIGHT) 결과로 내부 판정 후 UC-003에 직접 진입. 별도 외부 오퍼레이션 없음.
변경sideStatus(available)sideStatus(LEFT, status)
변경후진 중 좌·우 여유 공간 목록 수신 후진 중 좌측 센서가 좌측 장애물 유무를 전달한다. 반복 수신.
추가sideStatus(RIGHT, status)
좌측 막힘 시 rotateRight() 이후 전방 센서(우측 향함)가 우측 장애물 유무를 전달한다. 좌측 여유 확보 시 생략.
추가rotateLeft()
좌측 막힘 시 sideStatus(RIGHT) 수신 후 DriveMotor를 정면으로 복귀시킨다. 루프 재진입 및 최종 turn() 모두 원래 전방 기준으로 동작하도록 보장한다.
arch/analysis/ssd/SSD-004.md
SSD-004
SSD-004: 고출력 청소
연관 UC: UC-004
관련 요구사항: FR-04, SR-05
시스템 시퀀스 다이어그램
시스템 오퍼레이션 목록
오퍼레이션
설명
dustDetected()
먼지 감지 신호를 수신한다. 재감지 시 동일 오퍼레이션으로 타이머 초기화
분석 — 도메인 모델
arch/analysis/domain/domain.md
domainv2.0 수정
도메인 모델 (Domain Model)
개념 클래스 설명
외부 액터
액터는 시스템이 상태를 소유·관리하는 객체가 아니므로 필드를 표현하지 않는다.
센서 데이터는 시스템 오퍼레이션의 파라미터로 전달된다. 변경sideStatus(available) 좌·우 각각 sideStatus(LEFT, status) / sideStatus(RIGHT, status) 두 번의 별도 호출로 분리된다. 우측은 rotateRight() 이후 전방 센서가 전달한다.
클래스
단일 책임
User
시스템을 시작시키는 주체
ObstacleSensor
변경장애물 감지 이벤트를 RVCController에 전달한다 전방·좌측 장애물 감지 이벤트를 RVCController에 전달한다. sideStatus(LEFT)는 좌측 센서가 직접 전달하고, sideStatus(RIGHT)는 DriveMotor.rotateRight() 이후 전방 센서가 전달한다 (우측 전용 센서 없음).
IDriveMotor를 구현한다. NavigationController의 주행 명령을 수행한다
CleaningMotor
ICleaningMotor를 구현한다. CleaningController의 청소 출력 명령을 수행한다
인터페이스
클래스
역할
IDriveMotor
주행 모터 추상화. DIP 적용으로 NavigationController와 DriveMotor의 직접 의존을 차단한다
ICleaningMotor
청소 모터 추상화. DIP 적용으로 CleaningController와 CleaningMotor의 직접 의존을 차단한다
ITimerExpiredCallback
타이머 만료 콜백 추상화. HighPowerTimer↔CleaningController 순환 의존을 차단한다
시스템 내부 클래스
클래스
책임
RVCController
시스템 오퍼레이션을 수신하고 NavigationController·CleaningController에 위임한다. sideStatus(LEFT)·sideStatus(RIGHT) 결과로 회피 방향을 결정한다 (LEFT 여유 시 LEFT 우선; LEFT 막힘 시에만 RIGHT). 추가dustDetected(float) — 음수 입력 시 무시하는 오버로드. 추가changeState(int) — 0(IDLE)/1(CLEANING) 범위 외 값 및 동일 상태 전이 무시.
NavigationController
변경IDriveMotor를 제어한다. turn(available)에서 Direction 목록을 받아 방향 선택 로직(양쪽 여유 시 랜덤)을 수행한다IDriveMotor를 제어한다. turn(direction: Direction)으로 단일 방향을 받아 회전한다. rotateRight()로 전방 센서를 우측으로 회전시킨다. 방향 선택(좌측 우선)은 RVCController가 결정한다.
CleaningController
ICleaningMotor 출력을 제어하고 HighPowerTimer를 관리한다. ITimerExpiredCallback을 구현하며 onExpired() 수신 시 출력을 NORMAL로 복구한다. 추가normalizePower() — BOOST 상태에서 즉시 NORMAL로 복귀(비활성 및 비부스트 상태 시 무시).
HighPowerTimer
고출력 청소 지속 시간을 관리한다. 만료 시 ITimerExpiredCallback.onExpired()를 호출한다
변경NavigationController.turn(available) — Direction 목록을 받아 방향 선택 로직(랜덤 포함)을 NavigationController 내부에서 수행한다 (SRP)NavigationController.turn(direction: Direction) — 단일 방향을 받아 회전한다. 방향 선택(좌측 우선)은 RVCController가 두 sideStatus 결과로 결정한 뒤 전달한다.
변경예외 흐름 E1 (좌·우 모두 막힘): sideStatus([]) 수신 시(available이 빈 리스트) RVCController가 UC-003 흐름으로 전환한다 예외 흐름 E1: sideStatus(LEFT, blocked) AND sideStatus(RIGHT, blocked) 수신 시 RVCController가 UC-003 흐름으로 전환한다.
추가rotateRight() — RVCController → NavigationController → DriveMotor 순으로 위임하여 전방 센서를 우측으로 회전시킨다. sideStatus(LEFT) 수신 직후, sideStatus(RIGHT) 수신 직전에 호출한다.
추가rotateLeft() — sideStatus(RIGHT) 수신 직후 정면으로 복귀한다. 이후 turn(LEFT)/turn(RIGHT)이 모두 원래 전방 기준으로 대칭 동작하도록 보장한다.
arch/design/sd/SD-003.md
SD-003v2.0 수정
SD-003: 삼면 장애물 후진 회피
연관 UC: UC-003
연관 SSD: SSD-003
시퀀스 다이어그램
설계 노트
변경청소 재개(startCleaning)는 전진 시작 이후에 호출한다 (UC-003 기본 흐름 8→9 순서) 청소 재개(startCleaning)는 전진(moveForward) 이후에 호출한다 (UC-003 기본 흐름 9→10 순서).
변경후진 중 루프를 탈출하는 조건: available이 비어 있지 않을 때 후진 중 루프 탈출 조건: sideStatus(LEFT, clear) 또는 sideStatus(RIGHT, clear) 중 하나라도 수신될 때.
변경방향 선택 로직은 SD-002와 동일하게 NavigationController 내부에서 수행한다 방향 선택(좌측 우선)은 RVCController가 sideStatus 결과로 결정하고 NavigationController에 단일 방향을 전달한다.
추가 UC-003은 UC-002 E1에서 진입한다. CleaningMotor는 UC-002에서 이미 정지된 상태이므로 이 SD에서 별도의 stopCleaning 호출이 없다.
삭제allSidesBlocked() — ObstacleSensor → RVCController 외부 호출 (UC-002 내 두 sideStatus 결과로 내부 판정)
추가 후진 중 좌측이 막혀있을 때만 rotateRight() → sideStatus(RIGHT) → rotateLeft() 순으로 우측을 확인하고 정면 복귀한다. 좌측 clear 시 즉시 좌회전하며 우측 확인을 생략한다.
arch/design/sd/SD-004.md
SD-004
SD-004: 고출력 청소
연관 UC: UC-004
연관 SSD: SSD-004
시퀀스 다이어그램
설계 노트
DriveMotor는 UC-004 실행 중 주행 명령이 변경되지 않으므로 이 SD에 등장하지 않는다
HighPowerTimer는 CleaningController가 composition으로 소유한다 (도메인 모델 참조)
boostCleaning() 재호출 시 CleaningMotor에는 추가 명령을 보내지 않고 HighPowerTimer만 리셋한다
구현
src/code.md
codev2.0 수정
src/ 코드 변경 이력 — v2.0
변경 태그: 추가 / 삭제 (취소선) / 변경
단위 테스트(tests/)·시스템 테스트(system-tests/) 파일은 별도 관리하며 이 문서에 포함하지 않는다.
변경이 없는 파일은 목록 하단 변경 없음 절에 나열한다.
CleaningController에 active_ 상태 추적 및 guard 로직이 추가되면서, 비활성 상태에서 stopCleaning() / boostCleaning()을 호출하면 guard에 막혀 모터가 실제로 호출되지 않는다. 기존 테스트는 선행 상태(precondition) 없이 메서드를 바로 호출하고 있었으므로 수정이 필요했다.
또한 normalizePower() 신규 추가에 따라 대응 테스트 3개가 추가됐다. boostCleaning_whenAlreadyBoosting_doesNotCallMotorAgain은 startCleaning() 선행 없이 호출해 active_==false guard에 막혀 timer_.reset() 분기에 도달하지 못했으므로 선행 상태를 추가해 라인 커버리지 100%를 달성했다.
변경 내용
구분
테스트
내용
변경
stopCleaning_callsMotorStop
controller.startCleaning() 선행 호출 추가 — active_: false → true
변경
boostCleaning_whenIdle_switchesToHighLevel
controller.startCleaning() 및 motor.startCalls.clear() 선행 추가
controller.startCleaning() 선행 추가 — active_==false로 인해 timer_.reset() 분기 미도달 수정
추가
구분
테스트
검증 내용
추가
normalizePower_whenBoosting_restoresNormal
부스트 중 normalizePower() → NORMAL 복귀 및 모터 호출 확인
추가
normalizePower_whenNotBoosting_isIgnored
비부스트 상태에서 normalizePower() 무시 — 모터 재호출 없음
추가
normalizePower_whenInactive_isIgnored
비활성(active_==false) 상태에서 normalizePower() 무시
변경 없음
테스트
설명
startCleaning_callsMotorWithNormalLevel
NORMAL 레벨로 모터 호출 검증
onExpired_restoresNormalLevel
타이머 만료 시 NORMAL 복귀 검증
NavigationControllerTest.cpp
변경 배경
v2.0에서 turn(const std::vector<Direction>&) 시그니처가 turn(Direction) 단일 방향으로 변경되고, rotateRight() / rotateLeft() 메서드가 추가됐다. 이에 따라 벡터 기반 테스트를 삭제하고 단일 방향 기반으로 재작성했다.
또한 MotorState guard 추가로 인해 stop_delegatesToMotor가 초기 STOPPED 상태에서 stop()을 호출하면 guard에 막히게 되어 선행 상태 설정이 필요해졌다.
변경 내용
구분
테스트
내용
삭제
turn_emptyList_doesNotCallMotor
벡터 기반 — 빈 목록 시 모터 미호출 검증. 시그니처 변경으로 삭제
삭제
turn_singleLeft_turnsLeft
벡터 기반 단일 LEFT 검증. 삭제 후 아래로 대체
삭제
turn_singleRight_turnsRight
벡터 기반 단일 RIGHT 검증. 삭제 후 아래로 대체
삭제
turn_multipleDirections_picksExactlyOne
랜덤 방향 선택 검증. v2.0에서 랜덤 제거로 삭제
삭제
turn_calledTwice_motorCalledTwice
2회 연속 turn 검증. MotorState guard로 동작 변경되어 삭제
추가
turn_left_delegatesToMotor
turn(Direction::LEFT) 단일 방향 위임 검증
추가
turn_right_delegatesToMotor
turn(Direction::RIGHT) 단일 방향 위임 검증
추가
rotateRight_delegatesToMotor
rotateRight() → 모터 위임 검증
추가
rotateLeft_delegatesToMotor
rotateLeft() → 모터 위임 검증
변경
stop_delegatesToMotor
controller.moveForward() 선행 추가 — motorState_: STOPPED → FORWARD
변경 없음
테스트
설명
moveForward_delegatesToMotor
moveForward() → 모터 위임 검증
moveBackward_delegatesToMotor
moveBackward() → 모터 위임 검증
RVCControllerTest.cpp
변경 배경
v2.0에서 다음이 변경되었다:
sideStatus(const vector<Direction>&) → sideStatus(Direction, bool) 시그니처 변경
allSidesBlocked() 오퍼레이션 삭제 (내부 상태머신으로 대체)
STOPPED, STOPPED_CHECKING_RIGHT, REVERSING_CHECKING_RIGHT 상태 추가
rotateRight() / rotateLeft() 호출 흐름 추가
회피 방향 결정이 랜덤 → 좌측 우선으로 변경
이에 따라 기존 16개 테스트 전반이 재작성되고 10개가 추가됐다. 또한 신규 추가 메서드(dustDetected(float), changeState(int))의 커버리지 보완을 위해 6개 테스트가 추가됐다.